/*
 * @Description: 复制构建后 根目录下的monaco资源文件 到static/vue/monacoEdit文件夹下
 * @version: V1.0.0
 * @Author: Shuangshuang Song
 * @Date: 2020-12-30 13:54:31
 * @LastEditTime: 2021-01-28 16:36:54
 * @LastEditors: Shuangshuang Song
 */

const path = require('path');
const fs = require('fs');

const utils = {
  /**
   * @name src2monaco
   * @description: 把dist根目录下的 monaco的文件 复制到 指定目录下
   * @returns {}
   */
  src2monaco() {
    // 所有的需要复制的文件
    const files = ['editor.worker.js', 'css.worker.js', 'html.worker.js', 'json.worker.js', 'ts.worker.js'];
    try {
      this.copySrcFile(files);
      this.copyDirSync(path.join(__dirname, '../../../dist/static/vue/assets'), path.join(__dirname, '../../../dist/static/vue/chunks/assets'));
    } catch (error) {
      console.log(error);
    }
  },
  /**
   * @name copySrcFile
   * @description: 根据文件名 复制dist目录下指定文件
   * @param {Array|String} filename
   * @returns {}
   */
  copySrcFile(filename) {
    // dist文件夹
    const dist = path.resolve(__dirname, '../../../dist');
    const toDir = path.resolve(__dirname, '../../../dist/static/vue/monacoEdit'); // 复制到的目标文件夹
    // 可以单个或多个一起复制
    if (!Array.isArray(filename)) {
      filename = [filename];
    }
    // 循环复制
    filename.forEach((name) => {
      const fileUrl = path.join(dist, name); // 源文件
      // 如果存在文件
      if (fs.existsSync(fileUrl)) {
        const rstream = fs.createReadStream(fileUrl); // 创建读取流
        const wstream = fs.createWriteStream(path.join(toDir, name)); // 创建写入流
        rstream.pipe(wstream); // 复制
        setTimeout(() => {
          fs.unlinkSync(fileUrl); // 复制完 删除源文件
        });
      }
    });
  },
  /**
   * @name copyDirSync
   * @description: 复制目录
   * @param {String} src 源目录
   * @param {String} dst 目标目录
   * @returns:
   */
  copyDirSync(src, dst) {
    if (!fs.existsSync(dst)) {
      fs.mkdirSync(dst);
    }
    // 读取目录中的所有文件/目录
    const paths = fs.readdirSync(src);
    paths.forEach((_path) => {
      const _src = `${src}/${_path}`;
      const _dst = `${dst}/${_path}`;
      // fs.chmodSync(_src, 777); // 重写读写权限
      const st = fs.statSync(_src);
      // 判断是否为文件
      if (st.isFile()) {
        // 创建读取流
        const readable = fs.createReadStream(_src);
        // 创建写入流
        const writable = fs.createWriteStream(_dst);
        // 通过管道来传输流
        readable.pipe(writable);
      } else if (st.isDirectory()) {
        // 如果是目录则递归调用自身
        this.copyDirSync(_src, _dst);
      }
    });
  },
};

module.exports = utils;
